/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ucab.desarrollo.viajesbook.persistencia;

import java.util.List;
import org.hibernate.Session;
import ucab.desarrollo.viajesbook.beans.Amistad;
import ucab.desarrollo.viajesbook.beans.Usuario;

/**
 *
 * @author isak
 */
public class UsuarioDAO extends  AbstractHibernateDAO<Usuario, Integer> implements IUsuarioDAO
{

        /**
     * devuelve el tipo de objeto de dominio
     *
     * 
     * @return Usuario.class
     */
    @Override
    protected Class<Usuario> getDomainClass() {
        return Usuario.class;
    }

    /**
     * realiza la busqueda de un usuario por su login y password
     *
     * @param usuario
     * @return usuario
     */
    public Usuario buscarPorNombre(Usuario usuario)
    {

        Session sesion = getSession();
        String consulta = "from Usuario as u where u.usuariocorreoelectronico='" + usuario.getUsuariocorreoelectronico() + "' and u.usuariologin='"+ usuario.getUsuariologin() + "'";
        return (Usuario)sesion.createQuery(consulta).uniqueResult();                

    }

    public Usuario buscarPorId(Integer id)
    {

        Session sesion = getSession();
        String consulta = "from Usuario as u where u.idusuario="+id;
        return (Usuario)sesion.createQuery(consulta).uniqueResult();
    }

    /**
     * Metodo que busca un usuario por correo en la BD
     * @param usuario
     * @return
     */
   public Usuario buscarPorCorreo(Usuario usuario)
    {
        Session sesion = getSession();
        String consulta = "from Usuario as u where u.usuariocorreoelectronico='" + usuario.getUsuariocorreoelectronico()+"'";
        return (Usuario)sesion.createQuery(consulta).uniqueResult();
    }

   /**
    * metodo que crea un usuario
    * @param usuario
    */
    @Override
    public void salvar(Usuario usuario) {
    //    getHibernateTemplate().save(object);
        super.salvar(usuario);
        
    }

    /**
     * devuelve un usuario
     * @param usuario
     */
    public Usuario buscar(Usuario usuario)
    {   
        return super.buscar(usuario.getIdusuario());

    }

        /**
     * buscar un usuario por ID
      * @param usuario
     */
    public Usuario buscarById(int id)
    {   
        return super.buscar(id);

    }

    /**
     * actualiza un usuario
     * @param usuario
     */
    @Override
    public void actualizar(Usuario usuario)
    {
        super.actualizar(usuario);

    }

    /**
     * elimina un usuario
     * @param usuario
     */
   @Override
   public void borrar(Usuario usuario)
   {
        super.borrar(usuario);
   }
    
   /**
    * elimina un usuario por id
    * @param id
    */
    @Override
    public void borrarPorId(Integer id)
    {
        super.borrarPorId(id);
    }

    /**
     * devuelve la lista de usuarios de la Red Social
     * @return
     */
    @Override
    public List<Usuario> obtenerLista()
    {
        return super.obtenerLista();
    }

     /**
     * devuelve la lista de amistades por el nombre y apellido
     * @return
     */
    
    public List<Usuario> obtenerListaAmigosNomApe(Usuario usuario)
    {
        Session sesion = getSession();
        String consulta = "from Usuario as u where u.usuarionombre= '" + usuario.getUsuarionombre() + "' or  u.usuarioappellido='" + usuario.getUsuarioappellido() + "'";
        return sesion.createQuery(consulta).list();
    }

    /**
     * metodo para buscar amigos por el nombre
     * @param usuario
     * @return
     */
    public List<Usuario> obtenerListaAmigosNom(Usuario usuario)
    {
        Session sesion = getSession();
        String consulta = "from Usuario as u where u.usuarionombre= '" + usuario.getUsuarionombre() + "'" + " or u.usuarioappellido='" + usuario.getUsuarionombre() + "'" ;
        return sesion.createQuery(consulta).list();
    }


        public List<Usuario> devolverAmistadesUsuario(Integer id) {
        Session sesion = getSession();
        String consulta = "FROM Usuario u Where  u.idusuario in (SELECT usuarioByUsuarioSolicita as id FROM Amistad a where a.amistadaceptada='confirmada' and a.usuarioByUsuarioRecibe="+id+") or u.idusuario in (Select usuarioByUsuarioRecibe as id FROM Amistad a where a.amistadaceptada='confirmada' and a.usuarioByUsuarioSolicita="+id+")";
        return (List<Usuario>)sesion.createQuery(consulta).list();

    }

}

